home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Precision Software Appli…tions Silver Collection 3
/
Precision Software Applications Silver Collection Volume Three (PSM) (1993).iso
/
music2
/
sox.exe
/
SF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-15
|
3KB
|
124 lines
/*
* July 5, 1991
* Copyright 1991 Lance Norskog And Sundry Contributors
* This source code is freely redistributable and may be used for
* any purpose. This copyright notice must be maintained.
* Lance Norskog And Sundry Contributors are not responsible for
* the consequences of using this software.
*/
/*
* Sound Tools IRCAM SoundFile format handler.
*
* Derived from: Sound Tools skeleton handler file.
*/
#include "st.h"
#include "sfheader.h"
/* Private data for SF file */
typedef struct sfstuff {
struct sfinfo info;
} *sf_t;
extern int summary, verbose;
/*
* Do anything required before you start reading samples.
* Read file header.
* Find out sampling rate,
* size and style of samples,
* mono/stereo/quad.
*/
sfstartread(ft)
ft_t ft;
{
sf_t sf = (sf_t) ft->priv;
int i;
if (fread(&sf->info, 1, sizeof(sf->info), ft->fp) != sizeof(sf->info))
fail("unexpected EOF in SF header");
if (ft->swap) sf->info.sf_magic = swapl(sf->info.sf_magic);
if (ft->swap) sf->info.sf_srate = swapl(sf->info.sf_srate);
if (ft->swap) sf->info.sf_packmode = swapl(sf->info.sf_packmode);
if (ft->swap) sf->info.sf_chans = swapl(sf->info.sf_chans);
if (ft->swap) sf->info.sf_codes = swapl(sf->info.sf_codes);
if (sf->info.sf_magic != SF_MAGIC)
if (sf->info.sf_magic == swapl(SF_MAGIC))
fail("SF %s file: can't read, it is probably byte-swapped");
else
fail("SF %s file: can't read, it is not an IRCAM SoundFile");
/*
* If your format specifies or your file header contains
* any of the following information.
*/
ft->info.rate = sf->info.sf_srate;
switch(sf->info.sf_packmode) {
case SF_SHORT:
ft->info.size = WORD;
ft->info.style = SIGN2;
break;
case SF_FLOAT:
ft->info.size = FLOAT;
ft->info.style = SIGN2;
break;
default:
fail("Soundfile input: unknown format 0x%x\n",
sf->info.sf_packmode);
}
ft->info.channels = sf->info.sf_chans;
/* Future: Read codes and print as comments. */
/* Skip all the comments */
for(i = sizeof(struct sfinfo); i < SIZEOF_BSD_HEADER; i++)
getc(ft->fp);
}
sfstartwrite(ft)
ft_t ft;
{
sf_t sf = (sf_t) ft->priv;
int i;
sf->info.sf_magic = SF_MAGIC;
sf->info.sf_srate = ft->info.rate;
#ifdef LATER
/*
* CSound sound-files have many formats.
* We stick with the IRCAM short-or-float scheme.
*/
if (ft->info.size == WORD) {
sf->info.sf_packmode = SF_SHORT;
ft->info.style = SIGN2; /* Default to signed words */
} else if (ft->info.size == FLOAT)
sf->info.sf_packmode = SF_FLOAT;
else
fail("SoundFile %s: must set output as signed shorts or floats",
ft->filename);
#else
if (ft->info.size == FLOAT) {
sf->info.sf_packmode = SF_FLOAT;
ft->info.size = FLOAT;
} else {
sf->info.sf_packmode = SF_SHORT;
ft->info.size = WORD;
ft->info.style = SIGN2; /* Default to signed words */
}
#endif
sf->info.sf_chans = ft->info.channels;
sf->info.sf_codes = SF_END; /* No comments */
(void) fwrite(&sf->info, 1, sizeof(sf->info), ft->fp);
/* Skip all the comments */
for(i = sizeof(struct sfinfo); i < SIZEOF_BSD_HEADER; i++)
putc(0, ft->fp);
}
/* Read and write are supplied by raw.c */